import { app, ipcMain, powerSaveBlocker } from 'electron'
import { IpcChannel, WpcChannel, BpcChannel } from './events'
import { MainWindow, WindowCenter } from './window'
import { addDevToolsExtensionAtDevelopmentMode } from './extensions'
import ProtocolService from './protocol'
import { startUpdaterSchedule } from './updater'
import { ShortCut } from './shortcut'
import { CodeRunner } from './code'
import { AppMenu, ContextMenu } from './menu'
import { Download } from './file'
import { ElectronStore } from './store'
import { ElectronTray } from './tray'
import { MessageBox } from './dialog'
import { Clipboard } from './clipboard'
import { logger } from './collect'
import { IpcEvent } from 'app/type'

// 主入口
function main() {
    // 请求单例锁，避免打开多个electron实例
    const gotTheLock = app.requestSingleInstanceLock()
    let id = null
    if (!gotTheLock) {
        app.quit()
        return
    }
    // 是否允许渲染进程复用
    app.allowRendererProcessReuse = false

    // 初始化唤醒协议
    ProtocolService.setDefaultProtocol()
    ProtocolService.watchWindowProtocol()

    // 如果有第二个实例 将重启应用
    app.on('second-instance', () => {
        logger.info('event --> second-instance')
        MainWindow.restore()
    })

    // 启动
    app.on('ready', () => {
        logger.info('event --> ready')
        // 注册唤醒协议
        ProtocolService.registerStringProtocol()
        // 开发模式下加载浏览器扩展
        addDevToolsExtensionAtDevelopmentMode()
        // 创建主窗口
        MainWindow.creat()
        // 初始化窗口管理器
        WindowCenter.init()
        // 初始化顶部菜单管理器
        AppMenu.init()
        // 初始化右键菜单管理器
        ContextMenu.init()
        // 初始化状态栏菜单管理器
        ElectronTray.init()
        // 初始化快捷键管理器
        ShortCut.init()
        // 初始化下载管理器
        Download.init()
        // 初始化消息对话框管理器
        MessageBox.init()
        // 初始化剪切板
        Clipboard.init()
        // 初始化IPC监听【主窗口通信信道】
        IpcChannel.init()
        // 初始化WPC监听【跨窗口通信信道】
        WpcChannel.init()
        // 初始化BPC监听【发布、订阅信道】
        BpcChannel.init()
        // 初始化状态管理器
        ElectronStore.init()
        // 初始化代码片段执行器
        CodeRunner.init()
        // 防止休眠
        id = powerSaveBlocker.start('prevent-display-sleep')
        // 退出
        ipcMain.on(IpcEvent.APP_EXIT, () => app.quit())
    })

    app.on('will-finish-launching', () => {
        logger.info('event --> will-finish-launching')
        ProtocolService.watchMacProtocol()
        // 五小时检测一次更新
        // startUpdaterSchedule()
    })

    // 当所有窗口均关闭时，如果不是苹果系统，则退出应用
    app.on('window-all-closed', () => {
        logger.info('event --> window-all-closed')
        if (process.platform !== 'darwin') {
            app.quit()
        }
    })

    // 退出之前需要先关闭主窗口，否则无法退出
    app.on('before-quit', () => {
        logger.info('event --> before-quit')
        if (id) {
            powerSaveBlocker.stop(id)
        }
        BpcChannel.unInstall()
        MainWindow.close()
        app.exit()
    })

    app.on('quit', () => {
        logger.info('event --> quit')
    })

    // 激活窗口时重置主窗口
    app.on('activate', () => {
        logger.info('event --> activate')
        MainWindow.restore()
    })
}

main()
